Apache CXF 使用 - 04 -简介 - 如何开发一个服务的客户端

Apache CXF 使用 - 04 -简介 - 如何开发一个服务的客户端

WSDL2Java 生成客户端代码

最常见的情景是你有一个你能够或不能够管理的服务,且此服务有一个WSDL文件。在这种情况下需要从WSDL生成客户端(client),这为你提供了一个与服务交互的强类型的接口。一旦生成客户端代码,最典型的应用是:

HelloService service = new HelloService();
Hello client = service.getHelloHttpPort();
String result = client.sayHi("Joe");

WSDL2Java 工具可以从WSDL生成JAX-WS客户端代码. WSDL2java有三种运行方式:

更多信息查看 Developing a JAX-WS consumer

JAX-WS Proxy

除了直接使用wsdl2java生成的客户端存根(stub client),也可以使用Service.create来创建Service的实例。下述代码说明了此过程:

import java.net.URL;
import javax.xml.ws.Service;
...
URL wsdlURL = new URL("http://localhost/hello?wsdl");
QName SERVICE_NAME = new QName("http://apache.org/hello_world_soap_http", "SOAPService");
Service service = Service.create(wsdlURL, SERVICE_NAME);
Greeter client = service.getPort(Greeter.class);
String result = client.greetMe("test");

JAX-WS Dispatch APIs

JAX-WS 提供了一种“dispatch”(派遣、调度)机制来使没有生成客户端代码的服务的动态调用更加简单。使用Dispatch 机制你可以创建消息 (消息可以是 JAXB 对象, Source 对象, 或 SAAJ Message) ,并将它们调度到服务器( dispatch them to the server).例如:

import java.net.URL;
import javax.xml.transform.Source;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
...
URL wsdlURL = new URL("http://localhost/hello?wsdl");
Service service = Service.create(wsdlURL, new QName("HelloService"));
Dispatch<Source> disp = service.createDispatch(new QName("HelloPort"), Source.class, Service.Mode.PAYLOAD);
Source request = new StreamSource("<hello/>")
Source response = disp.invoke(request);

注:也可以在没有WSDL的情况下使用dispatch。

Simple Frontend Client Proxy

如果使用 simple frontend开发了一个服务,你可以使用 ClientProxyFactoryBean 的API 来为你的服务创建一个java代理客户端 . 这样,你就可以使用服务接口与你的服务进行对话. 参考 Simple Frontend.

动态客户端 Dynamic Client

CXF包含一个允许你激活操作和为操作传递参数的客户端接口。例如:

Client client = ....;
Object[] result = client.invoke("sayHi", "Dan");

有两种方式在运行时创建Clients .第一种是使用 ClientFactoryBeanJaxWsClientFactoryBean 类. 这将为服务SEI(service endpoint interface)创建一些代理对象. 注意,这些代理不能够处理复杂对象.

第二种是使用DynamicClientFactory或其子类。DynamicClientFactory进一步为WSDL中描述的复杂对象生成和编译JAXB POJO,在运行时通过反射使用。

这在你将CXF与动态语言,如Groovy,一起使用时特别有用 ,但直接从java中使用反射也是可以的.

更多信息参考: Dynamic Clients

文章目录
  1. 1. Apache CXF 使用 - 04 -简介 - 如何开发一个服务的客户端
    1. 1.1. WSDL2Java 生成客户端代码
      1. 1.1.1. JAX-WS Proxy
      2. 1.1.2. JAX-WS Dispatch APIs
      3. 1.1.3. Simple Frontend Client Proxy
      4. 1.1.4. 动态客户端 Dynamic Client
|